import Vue from 'vue'
import axios from 'axios'
import VueAxios from 'vue-axios'

Vue.use(VueAxios,axios)

// 创建instance
const instance = axios.create({
    baseURL: 'http://toutiao.itheima.net',
    timeout: 10000
})

// 导入token.js
import {getToken, saveToken} from './token.js'
// 导入toast弹窗
import {Toast} from './vant.js'
// 导入路由router (这个文件导入的router就是vue原型中的$router)

// 添加请求拦截器 : 给项目添加默认token
instance.interceptors.request.use(
    function (config) {
        // 在发送请求之前做些什么
        // 应用场景：添加默认请求参数 或 默认请求头(如token)
        if(getToken()){
            config.headers.Authorization = `Bearer ${getToken().token}`
        }
        return config
    },
    function (error) {
        // 对请求头错误做些什么
        return Promise.reject(error)
    }
)

// 添加响应拦截器：处理401 token刷新问题
instance.interceptors.response.use(
    function (response) {
        // 对响应数据做点什么
        return response
    },
    async function (error) {
        // 对响应错误做点什么
        // 场景：拦截服务器一些错误代码 

        // 1.判断状态码是不是401
        if(error.response && error.response.status == 401){
            // 1.1 是401
        
            // 2.判断有没有token
            if(getToken()){
                // 2.1 有token，说明token过期，处理方式刷新token
                /* 这个地方不能使用instance发请求
                  原因：
                    (1)这个刷新接口的参数需要refresh_token,而不是token
                    (2) instance默认会在请求拦截发送token.(token已经是过期的用不了)
                  解决：使用axios来发送请求
                    axios没有添加拦截器，不会默认添加token
                    axios没有基地址，需要写全地址
                */
               try {
                   let res = await axios({
                       url: 'http://toutiao.itheima.net/v1_0/authorizations',
                       method: 'put',
                       headers: {
                           Authorization: `Bearer ${getToken().refresh_token}`
                       }
                   })
                   console.log(res);
                   // 服务器返回新的token，更新localStorage中的token
                   saveToken({
                       token: res.data.data.token,
                       refresh_token:getToken().refresh_token
                   })
                   //重新发送用户之前的请求
                   return instance(error.config) 
               } catch (err){
                //    refresh_token也过期
                Toast.success('请先登录')
                router.push('/login')
               }
            } else{
                // 2.2 没有token：说明用户没有登录，跳转登录页
                Toast.success('请先登录')
                // 跳转登录页
                router.push('login')
            }
        }else{
            // 1.2 不是401，错误与token无关：不做任何处理
        }

        return Promise.reject(error)
    }
)

export default instance